#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/wait.h>
int main()
{
    pid_t id=fork();
    if(id<0)
    {
        perror("fork");
        exit(1);
    }
    else if(id==0)
    {
        int cnt=5;
        while(cnt)
        {
            printf("I am child pid:%d ppid:%d cnt:%d\n",getpid(),getppid(),cnt);
            cnt--;
            sleep(1);
        }
    }
    else{
        int cnt=10;
        while(cnt)
        {
            printf("I am father pid:%d ppid:%d cnt=%d\n",getpid(),getppid(),cnt);
            cnt--;
            sleep(1);
            //当父进程调用wait()时：
            //若存在僵尸子进程：立即回收并返回，父进程继续执行。
            //若无僵尸子进程且有运行中的子进程：父进程阻塞（暂停执行），直到任意子进程终止并变为僵尸。
            //若无任何子进程：立即返回 - 1，父进程继续执行。
    
            //当父进程调用wait()等待子进程时，父进程会进入阻塞状态（暂停执行），直到子进程终止并变为僵尸状态，此时父进程才会被唤醒
            pid_t ret=wait(NULL);
            if(ret>0)
            {
                printf("wait success ret=%d\n" ,ret);
            }



            //if(cnt<5)
            //{
            //    //到目前为止，进程等待是必须的！
            //    //wait是等待任意一个子进程退出       
            //    //wait() 不会回收正常运行的子进程，只能处理已终止但尚未被回收的僵尸子进程
            //    pid_t ret=wait(NULL);//会直接回收子进程
            //    if(ret==id)
            //    {
            //        printf("wait success,ret=%d\n",ret);
            //    }
            //}
            
        //pid_t ret=wait(NULL);//会直接回收子进程
        //if(ret==id)
        //{
        //    printf("wait success,ret=%d\n",ret);
        //}   
        //sleep(5);
        }
    return 0;
    }
}
